package com.book.config;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;

import java.util.Collections;

public class CodeGeneration {
    @Test
    public void CodeGenerationtest() {
        //  获取当前项目路径
        String property = System.getProperty("user.dir");
        //  文件生成地址
        String fileGenerationAddress = "/src/main/java";
        //  xml存放的路径
        String thePathWhereTheXmlIsStored = "/src/main/resources/mapper";

        //  网址：https://baomidou.com/pages/981406/
        FastAutoGenerator.create("jdbc:mysql://47.98.39.93:3306/dongdongbook?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8",
                "xiaoshuo", "1234").globalConfig(builder -> {
            builder.author("wx")//作者
                    .fileOverride()//覆盖已经存在的文件
//                    .outputDir("D://baomidou")//文件生成地址
                    .outputDir(property + fileGenerationAddress)//文件生成地址
                    .commentDate("yyyy-MM-dd HH:mm:ss");//时间格式

        }).packageConfig(builder -> {//包设置
            //  TODO 需要修改
            builder.parent("com.ddbook")//父类路径设置
                    //  TODO 需要修改
                    //.moduleName("")//模块名称，指定生成在哪个模块
                    .entity("model")//实体类包名
                    .service("service")//服务类包名
                    .serviceImpl("service.impl")//服务类包名
                    .controller("controller")//controller层包名
                    .mapper("mapper")//dao层包名
                    .xml("mapper")//xml包名
                    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, property + thePathWhereTheXmlIsStored));//xml存放的路径
        }).strategyConfig(builder -> {//设置文件生成名字
            //  TODO 需要修改
            //t_person  tb_user
            builder.addInclude("book_free","t_book")//需要生成的表名，用逗号隔开，可以多个表生成
                    .addTablePrefix("t_")//增加过滤表前缀
                    .addTableSuffix()//增加过滤表后缀
                    .addFieldPrefix("")//指定表的哪些字段去掉
                    .addFieldSuffix()//增加过滤字段后缀
                    .serviceBuilder()//开始设置服务层
                    .formatServiceFileName("%sService")//这里整体为 %s（代表表名）+ 后面的Service
                    .formatServiceImplFileName("%sServiceImpl")
                    .entityBuilder()//实体策略配置
                    .enableColumnConstant()//生成字段常量
                    .naming(NamingStrategy.underline_to_camel)//生成符合驼峰命名
                    .enableChainModel()//支持链式书写
                    .enableLombok()//支持lombok
//                    .versionColumnName("version")//指定乐观锁的字段名称
//                    .addTableFills(new Property("gmtCreate", FieldFill.INSERT))
//                    .addTableFills(new Property("gmtModified", FieldFill.INSERT_UPDATE))
                    .logicDeletePropertyName("deleted")//指出逻辑删除
                    .enableTableFieldAnnotation()//提供字段注解
                    .controllerBuilder()
                    .formatFileName("%sController")
                    .enableRestStyle()//生成@restcontroller 风格
                    .mapperBuilder()
                    .superClass(BaseMapper.class)//继承
                    .formatMapperFileName("%sDao")
                    .enableMapperAnnotation()//开启注解
                    .formatXmlFileName("%sMapper");

        }).strategyConfig(builder -> {
            builder.mapperBuilder()
                    .superClass(BaseMapper.class)
                    .enableBaseResultMap()
                    .enableBaseColumnList()
//                    .cache(MyMapperCache.class)
                    .formatMapperFileName("%sDao")
                    .formatXmlFileName("%sXml");
        }).templateEngine(new FreemarkerTemplateEngine()).execute();//使用Freemarker引擎模板，默认的是Velocity引擎模板
    }
}